home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / tetujin.c < prev    next >
Text File  |  1994-11-16  |  11KB  |  424 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include <guidbg.h>
  13. #include "tetujin.h"
  14.  
  15.  
  16. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  17.  
  18. /*    アラートメッセージ                        */
  19. static char    *alertStrMem[] = 
  20.                 {"画像処理の鉄人達:\nメモリが不足しています", "確認"};
  21.  
  22. /*    checkMemFunc関数/alertMemFunc関数の追い越し禁止フラグ    */
  23. static int        checkMemFlag = 0x00 ;
  24.  
  25. /****************************************************************/
  26. /*    メモリ不足時のアラート関数(イベント登録関数)                */
  27. /****************************************************************/
  28. void alertMemFunc()
  29. {
  30.     /*    メモリ不足のアラート表示    */
  31.     MMI_CallMessage(MMI_GetApliId(), GM_ALERT, 
  32.                         AM_ALERT1 | AM_ALERTB0E,(int)alertStrMem) ;
  33.  
  34.     /* checkMemFunc関数/alertMemFunc関数の追い越し禁止解除    */
  35.     checkMemFlag &= 0xef ;
  36. }
  37.  
  38. /****************************************************************/
  39. /*    メモリ開放関数                                                */
  40. /****************************************************************/
  41. int checkMemFunc(useMem)
  42. int    useMem ;
  43. {
  44.     int        ret ;
  45.  
  46.     /*    メモリチェック                    */
  47.     if(TL_checkMemory(1) * 4096 >= useMem)
  48.         return NOERR ;        /*    メモリがあれば正常復帰        */
  49.  
  50.     do
  51.     {
  52.         /*    メモリ開放処理                */
  53.         ret = MMI_CallMessage(MMI_GetApliId(), GM_PURGE, 0, 0) ;
  54.  
  55.         /*    メモリチェック                */
  56.         if(TL_checkMemory(1) * 4096 >= useMem)
  57.             break ;
  58.     } while(ret == NOERR) ;
  59.  
  60.     return    ret ;
  61. }
  62.  
  63.  
  64. /****************************************************************/
  65. /*    Townsシェル呼び出し関数                                        */
  66. /****************************************************************/
  67. int userFunc(aplId, messId, info, data)
  68. int        aplId ;
  69. int        messId ;
  70. int        info ;
  71. int        data ;
  72. {
  73.     register int    ret ;
  74.     int                sw ;
  75.     POOLDATA        *ptr ;
  76.  
  77.     ret = ILLEGAL_FUNCTION ;
  78.  
  79.     switch (messId)
  80.     {
  81.         case    GM_WAKE :
  82.         {
  83.             EVENT    ev ;
  84.  
  85.             /*    checkMemFunc関数の追い越し禁止判定            */
  86.             if(checkMemFlag & 0x01)
  87.                 break ;
  88.  
  89.             /*    動作メモリのチェック                        */
  90.             /*    checkMemFunc関数の追い越し禁止        */
  91.             checkMemFlag |= 0x01 ;
  92.             if(checkMemFunc(MinMem) != NOERR)
  93.             {
  94.                 /*    alertMemFunc関数の追い越し禁止    */
  95.                 checkMemFlag |= 0x10 ;
  96.                 /*    メモリ不足の場合はアラート処理関数をイベント登録する    */
  97.                 MMI_FlushEvnt() ;
  98.                 ev.what = EVEXEC ;
  99.                 ev.shift = 0 ;
  100.                 ev.info = (int)alertMemFunc ;
  101.                 MMI_SetEvnt(&ev) ;
  102.                 break ;
  103.             }
  104.  
  105.             break ;
  106.         }
  107.  
  108.         case    GM_SLEEP :
  109.         {
  110.             /* alertMemFunc関数がイベント登録されてなければ、checkMemFunc関数
  111.                 の追い越し禁止解除                                            */
  112.             if((checkMemFlag & 0x10) == 0x00)
  113.                 checkMemFlag &= 0xfe ;
  114.  
  115.             extern int sleepSet() ;
  116.  
  117.             sleepSet() ;
  118.             break ;
  119.         }
  120.  
  121.         case    GM_QUIT :
  122.         {
  123.             extern int quitFunc2() ;
  124.  
  125.             ret = quitFunc2() ;
  126.             break ;
  127.         }
  128.  
  129.     }
  130.     return ret ;
  131.  
  132. }
  133.  
  134. void main()
  135. {
  136.     extern int APL_init() ;
  137.     extern int startSet() ;
  138.  
  139.     MMICTRL ctrl ;
  140.     int kobj ;
  141.  
  142.     /*    初期化処理    */
  143.  
  144.     ctrl.page0=SCREEN32K;
  145.     ctrl.page1=SCREENUNUSED;
  146.     ctrl.writePage=0;
  147.     ctrl.displayPage=1;
  148.     ctrl.priority=0;
  149.     ctrl.mode=SCREENAVAILABLE;
  150.     ctrl.width=SCREENEXPAND;
  151.  
  152.     ctrl.size=0;
  153.     ctrl.ptr=NULL;
  154.  
  155.     ctrl.asize=0;
  156.     ctrl.aptr=NULL;
  157.  
  158.     ctrl.move.lupx=-16384;
  159.     ctrl.move.lupy=    20;
  160.     ctrl.move.rdwx= 16383;
  161.     ctrl.move.rdwy= 16383;
  162.  
  163.     ctrl.white = 15 ;
  164.     ctrl.black = 8 ;        /* GUIの表示色を変更(黒)     */
  165.     ctrl.gray = 7 ;            /*      〃          (灰色)   */
  166.     ctrl.xor = 15 ;            /*      〃          (反転色) */
  167.  
  168.     /*    二重起動のチェック        */
  169.     if((kobj = MMI_CallMessage(MMI_GetApliId(),
  170.                                     GM_QUERYID, QM_KIND, 1)) > NOERR)
  171.     {
  172.         /*    同一ファイル名のアプリが既に存在する場合は
  173.             自アプリを終了する                    */
  174.         MMI_CallMessage(MMI_GetApliId(), GM_SWITCH, FALSE, kobj) ;
  175.  
  176.     }
  177.     /*    初期化処理                */
  178.     else if (MMI_Open( &ctrl ) == NOERR)
  179.     {
  180.         /*    初期化に成功すればメインループに入る.    */
  181.         if (APL_init() == NOERR)
  182.         {
  183.             /*    動作メモリのチェック    */
  184.             /*    checkMemFunc関数の追い越し禁止    */
  185.             checkMemFlag |= 0x01 ;
  186.             if(checkMemFunc(MinMem) != NOERR)
  187.             {
  188.                 /*    alertMemFunc関数の追い越し禁止    */
  189.                 checkMemFlag |= 0x10 ;
  190.                 alertMemFunc();            /*    メモリ不足のアラート表示    */
  191.             }
  192.             /*    checkMemFunc関数の追い越し禁止解除    */
  193.             checkMemFlag &= 0xfe ;
  194.  
  195.             FDG_SaveCurDir() ;        /*    カレントディレクトリ保存    */
  196.             FDG_InitFileDlg() ;        /*    ファイルダイアログ初期化    */
  197.  
  198.             if( startSet() == NOERR )
  199.                 MMI_ExecSystem() ;        /*    メインのイベントループ        */
  200.  
  201.             FDG_FreeFileDlg() ;        /*    ファイルダイアログ終了処理    */
  202.             FDG_RecovCurDir() ;        /*    カレントディレクトリ復元    */
  203.  
  204.             MMI_SendMessage(MMI_GetSleepObj(), MM_SLEEP, 0) ;
  205.             MMI_SetWakeObj(UNUSED);
  206.         }
  207.         /*    終了処理                */
  208.         MMI_Close() ;
  209.     }
  210.  
  211. }
  212.  
  213.  
  214.  
  215. int APL_init()
  216. {
  217.     extern MMIINIT    initDataIGRABOU ;
  218.     extern MMIINIT    initDataIGRDSK ;
  219.     extern MMIINIT    initDataIGRERR ;
  220.     extern MMIINIT    initDataIGRWIN ;
  221.     extern MMIINIT    initDataIGRFILE ;
  222.     extern MMIINIT    initDataIGRSET ;
  223.  
  224.     extern GRAPHWIN    window[] ;
  225.     extern int windowId ;
  226.     extern int vscrollId ;
  227.     extern int hscrollId ;
  228.  
  229.     extern int        mItemId[] ;
  230.  
  231.     register int    ret ;
  232.     int i ;
  233.  
  234.     /*    EGB ワークアドレスの取得.    */
  235.     guiEgbPtr = MMI_GetEgbPtr() ;
  236.  
  237.     /*    ハイパ型部品の初期化            */
  238.     if ((ret = MMI_initHyper()) < 0)
  239.         return ret ;
  240.     /*    リストメニュー型部品の初期化    */
  241.     if ((ret = MMI_initListMenuL40()) < 0)
  242.         return ret ;
  243.     /*    ダイアログ型部品の初期化        */
  244.     if ((ret = MMI_initDialogL40()) < 0)
  245.         return ret ;
  246.     /*    アラート型部品の初期化            */
  247.     if ((ret = MMI_initAlertL40()) < 0)
  248.         return ret ;
  249.     /*    ウインドウ型部品の初期化        */
  250.     if ((ret = MMI_initWindowL40()) < 0)
  251.         return ret ;
  252.     /*    メッセージ型部品の初期化        */
  253.     if ((ret = MMI_initMessageL40()) < 0)
  254.         return ret ;
  255.     /*    メニュー型部品の初期化            */
  256.     if ((ret = MMI_initMenuL40()) < 0)
  257.         return ret ;
  258.     /*    ボタン型部品の初期化            */
  259.     if ((ret = MMI_initButtonL40()) < 0)
  260.         return ret ;
  261.     /*    ドロウボタン型部品の初期化        */
  262.     if ((ret = MMI_initDrawButtonL40()) < 0)
  263.         return ret ;
  264.     /*    アイコンボタン型部品の初期化    */
  265.     if ((ret = MMI_initIconL40()) < 0)
  266.         return ret ;
  267.     /*    トグルアイコン型部品の初期化    */
  268.     if ((ret = MMI_initToggleIconL40()) < 0)
  269.         return ret ;
  270.     /*    メニューアイテム型部品の初期化    */
  271.     if ((ret = MMI_initMenuItemL40()) < 0)
  272.         return ret ;
  273.     /*    スクロール型部品の初期化        */
  274.     if ((ret = MMI_initScrollBarL40()) < 0)
  275.         return ret ;
  276.     /*    テキスト型部品の初期化            */
  277.     if ((ret = MMI_initTextL40()) < 0)
  278.         return ret ;
  279.     /*    数値入力型部品の初期化            */
  280.     if ((ret = MMI_initNumBoxL40()) < 0)
  281.         return ret ;
  282.  
  283.     /*    パレット変更 */
  284.     setPalette() ;
  285.  
  286.     /*    背景データの初期化                        */
  287.  
  288.     /*    データの登録        */
  289.     if ((ret = MMI_Init(&initDataIGRABOU)) < 0)
  290.         return ret ;
  291.  
  292.     if ((ret = MMI_Init(&initDataIGRDSK)) < 0)
  293.         return ret ;
  294.  
  295.     if ((ret = MMI_Init(&initDataIGRERR)) < 0)
  296.         return ret ;
  297.  
  298.     if ((ret = MMI_Init(&initDataIGRWIN)) < 0)
  299.         return ret ;
  300.  
  301.     if ((ret = MMI_Init(&initDataIGRFILE)) < 0)
  302.         return ret ;
  303.  
  304.     if ((ret = MMI_Init(&initDataIGRSET)) < 0)
  305.         return ret ;
  306.  
  307.     /* 解像度にあわせてボタンの位置を変更 */
  308.  
  309.     extern int    quitIconId ;
  310.     extern int    outIconId ;
  311.     extern int    boundWidth ;
  312.  
  313.     WINCTRL *pctrl ;
  314.     HYPER hyp ;
  315.  
  316.     MMI_GetControl( &pctrl ) ;
  317.     boundWidth = pctrl->bound.rdwx + 1 ;
  318.     MMI_SendMessage( quitIconId, MM_GETHYPER, 1, &hyp ) ;
  319.     hyp.fr.lupx = pctrl->bound.rdwx - 28 ;
  320.     hyp.fr.lupy = 0 ;
  321.     hyp.fr.rdwx = pctrl->bound.rdwx -  9 ;
  322.     hyp.fr.rdwy = 19 ;
  323.     MMI_SendMessage( quitIconId, MM_MOVE, 1, &(hyp.fr) ) ;
  324.  
  325.     MMI_SendMessage( outIconId, MM_GETHYPER, 1, &hyp ) ;
  326.     hyp.fr.lupx = pctrl->bound.rdwx - 59 ;
  327.     hyp.fr.lupy = 0 ;
  328.     hyp.fr.rdwx = pctrl->bound.rdwx - 40 ;
  329.     hyp.fr.rdwy = 19 ;
  330.     MMI_SendMessage( outIconId, MM_MOVE, 1, &(hyp.fr) ) ;
  331.  
  332.     /* 解像度にあわせて基準になるウインドウの位置を変更 */
  333.  
  334.     HYPER    winhyp ;
  335.     HYPER    vschyp ;
  336.     HYPER    hschyp ;
  337.     FRAME    org ;
  338.     FRAME    size ;
  339.  
  340.     MMI_SendMessage( windowId , MM_GETHYPER , 1 , &winhyp );
  341.     MMI_SendMessage( vscrollId , MM_GETHYPER , 1 , &vschyp );
  342.     MMI_SendMessage( hscrollId , MM_GETHYPER , 1 , &hschyp );
  343.     MMI_SendMessage( windowId , MM_GETUSER , 2 , &org , &size );
  344.  
  345.     winhyp.fr.rdwx = winhyp.fr.rdwx + boundWidth - 512 ;
  346.     org.rdwx = org.rdwx             + boundWidth - 512 ;
  347.     size.rdwx = size.rdwx           + boundWidth - 512 ;
  348.  
  349.     vschyp.fr.lupx = vschyp.fr.lupx + boundWidth - 512 ;
  350.     vschyp.fr.rdwx = vschyp.fr.rdwx + boundWidth - 512 ;
  351.     hschyp.fr.rdwx = hschyp.fr.rdwx + boundWidth - 512 ;
  352.  
  353.     MMI_SendMessage( windowId , MM_SETHYPER , 1 , &winhyp ) ;
  354.     MMI_SendMessage( vscrollId , MM_SETHYPER , 1 , &vschyp ) ;
  355.     MMI_SendMessage( hscrollId , MM_SETHYPER , 1 , &hschyp ) ;
  356.     MMI_SendMessage( windowId , MM_SETUSER , 2 , &org , &size ) ;
  357.  
  358.  
  359.     /*    ウィンドウの影の存在から実態を生成する                */
  360.     for( i = 0 ; i < WINCOUNT ; i++ )
  361.     {
  362.         /*    ウィンドウ,テキスト,スクロールバーを生成する    */
  363.         window[i].windowId = -(MMI_SendMessage( windowId , MM_NEW , 0)) ;
  364.         window[i].vscrollId = MMI_SendMessage( vscrollId , MM_NEW , 0);
  365.         window[i].hscrollId = MMI_SendMessage( hscrollId , MM_NEW , 0);
  366.         window[i].buf16m = NULL ;
  367.         window[i].bufAlpha = NULL ;
  368.         window[i].buf32k = NULL ;
  369.         window[i].loadPath[0] = 0 ;
  370.         window[i].savePath[0] = 0 ;
  371.     }
  372.  
  373.     /*    タスクリストとサイドワークメニューを登録する    */
  374.     MMI_SetUpPrgMenu( mItemId[0], 2 ) ;
  375.     MMI_SetUpSDKMenu( mItemId[0], 4 ) ;
  376.  
  377.     /*    呼び出し関数を登録する    */
  378.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc) ;
  379.  
  380.     /*    アプリケーション名を登録する    */
  381.     MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)"画像処理の鉄人達", 0) ;
  382.  
  383.     /*    背景を表示する                            */
  384.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  385.  
  386.     return NOERR ;
  387. }
  388.  
  389. /*    32kモード専用パレット設定 */
  390. static int    setPalette()
  391. {
  392.     int temp ;
  393.     unsigned int *table ;
  394.  
  395.     table = MG_getColorTable( 2 ) ;    /* mode 0:16色, 1:256色 2:32768色 */
  396.  
  397.     void     set1Pal( int n, int b, int r, int g )
  398.     {
  399.         temp = (b * 2) + ((r * 2) << 5) + ((g * 2) << 10) ;
  400.         table[ n ] = temp + ( temp << 16 ) ;
  401.     }
  402.  
  403. /*    16色のパレットだと思って設定すればよい */
  404.     set1Pal( 0, 0, 0, 0 ) ;
  405.     set1Pal( 1, 4, 4, 8 ) ;
  406.     set1Pal( 2, 4, 12, 6 ) ;
  407.     set1Pal( 3, 5, 5, 5 ) ;        // ( 3, 10, 15, 12 )
  408.     set1Pal( 4, 9, 9, 9 ) ;
  409.     set1Pal( 5, 7, 0, 12 ) ;
  410.     set1Pal( 6, 12, 12, 12 ) ;
  411.     set1Pal( 7, 8, 8, 8 ) ;        // ( 7, 7, 7, 7 )
  412.     set1Pal( 8, 1, 1, 1 ) ;
  413.     set1Pal( 9, 8, 10, 12 ) ;    /* file selector */
  414.     set1Pal( 10, 0, 13, 0 ) ;
  415.     set1Pal( 11, 10, 0, 0 ) ;
  416.     set1Pal( 12, 0, 0, 15 ) ;
  417.     set1Pal( 13, 15, 0, 15 ) ;
  418.     set1Pal( 14, 0, 15, 13 ) ;
  419.     set1Pal( 15, 15, 15, 15 ) ;
  420.  
  421.     return NOERR ;
  422. }
  423.  
  424.